/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.architexa.org.eclipse.gef;

/**
 * A specialization of {@link GraphicalEditPart GraphicalEditPart} for representing
 * connections. ConnectionEditParts must join a <I>source</I> and <I>target</I> EditPart.
 * Its Figure is typically a line between two "nodes", with possible decorations on that
 * line.
 * <P>
 * In GEF, ConnectionEditParts are <EM><I>structural features</I></EM> of their source
 * and target "nodes", which are EditParts.  However, the model does not have this
 * requirement. The application may store the connection model in any way, or there may
 * even be no real model.  The burden is on the source and target EditPart to obtain their
 * appropriate connections in the methods {@link
 * com.architexa.org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelSourceConnections()
 * getModelSourceConnections()} and {@link
 * com.architexa.org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelTargetConnections()
 * getModelTargetConnections()}. How this is done is application specific.
 * <P>
 * Since ConnectionEditParts are features of their node EditPart, it is those EditParts
 * that must create and manage the connection.  Creation is performed by whichever end
 * happens to "intialize" itself first.  Therefore an end always looks first in the {@link
 * com.architexa.org.eclipse.gef.EditPartViewer#getEditPartRegistry() EditPartRegistry} to see if the
 * connection was already created by the other end.
 * <P>
 * ConnectionEditParts are EditParts, and therefore can have children. This is a common
 * way to implement labels and other selectable decorations on connections. Similarly, a
 * ConnectionEditPart can also be a "node", meaning it can serve as the source or target
 * of some other ConnectionEditPart.  This makes connection to connection possible.
 * <P>
 * IMPORTANT: The need to display something as a line does not automatically mean that
 * a ConnectionEditPart is required.  There are several situations in which
 * ConnectionEditParts should not be used.  You should use ConnectionEditParts in general
 * if:
 * <UL>
 * 	<LI>The connection should be selectable by the user independant of its "nodes".
 * 	<LI>The connection can be deleted, leaving the source and target intact.
 * 	<LI>The connection cannot exist without a source and target.  A instance of when
 * 	  this is <B>not</B> true is <I>assocations</I>.  Associations are top-level object
 * 	  that are children of the diagram.  They are probably only valid if they have a source
 * 	  and target, but many applications allow you to create things in any order.
 * </UL>
 */
public interface ConnectionEditPart
	extends GraphicalEditPart
{

/**
 * @return the EditPart at the <i>source</i> end of this connection.
 */
EditPart getSource();

/**
 * @return the EditPart at the <i>target</i> end of this connection.
 */
EditPart getTarget();

/**
 * Sets the <i>source</i> of this connection.
 * @param source the source of this connection
 */
void setSource(EditPart source);

/**
 * Sets the<i>target</i> of this connection.
 * @param target the target of this connection
 */
void setTarget(EditPart target);
}
